package main
import (
	"fmt"
)
//类型断言 : 如何将一个接口变量，赋给自定义类型的变量 ？
//类型断言：由于接口是一般类型，不知道具体类型，如果要转成具体类型，就需要使用类型断言！
/*如下：
var t float64
var i interface{}
i = t
y := i.(float64)   y's Type is float64
*/
type Point struct{
	x int
	y int
}
func main(){
	var a interface{}
	var p Point = Point{1,3}
	a = p //OK!
	var p2 Point
	//p2 = a // err!!! 不可以直接赋值，必须使用类型断言 ==> p2 = a.(Point)【判断a是否是指向Point类型的变量，如果是就转成Point类型并且赋给p2变量】 断言是不能乱转，只有a原来就是指向Point的才可以
	p2 = a.(Point)
	fmt.Println("P :",p2)

	var t float64 = 9.9
	var i interface{}
	i = t
	y := i.(float64) //如果类型不匹配会报错panic！因此进行类型断言时，要确保原来空接口指向的就是要断言的类型！
	fmt.Printf("y's Type is %T and y'value is %v\n",y,y)

	//如果在进行断言时，带一个检测机制!!!匹配就ok，不匹配也不要报panic！
	var t2 float64 = 9.9
	var i2 interface{}
	i2 = t2
	y2,ok := i2.(float64) //类型不匹配无法断言
	if ok {
		fmt.Println("转换成功!")
		fmt.Printf("y's Type is %T and y'value is %v\n",y2,y2)
	}else{
		fmt.Println("转换失败！")
	}
	fmt.Printf("程序继续执行")
}